/********************************************************
*Definicion de lista de listas simplemente encadenada   *
*Author     :   Simon Emmanuel Gutierrez Brida          *
*Version    :   0.1                                     *
*Fecha      :   Septiembre/2011                         *
*------------------------------------------------       *
*Define la estructura y funcione asociadas al manejo    *
*de lista simplemente encadenada                        *
*Una lista esta formada por :                           *
*- inicio   : la cabeza de la lista                     *
*- longitud : la longitud de la lista                   *
*********************************************************/

#ifndef LISTALISTAS_H
#define LISTALISTAS_H

#include "nodolista.h"
#include "lista.h"
#include <stdbool.h>


typedef struct {
    NodoLista   *inicio;
    int         longitud;
} ListaListas;

/*funciones publicas para manipular listas*/

/*constructores*/

/**
 * Construye una nueva lista vacia
 */
ListaListas* nuevaListaListas();

/*lectura de informacion*/

/**
 * Obtiene el elemento (lista) en una determinada posicion
 * parametros
 * lista: lista sobre la cual obtener el elemento
 * index: el indice del elemento
 */
Lista* obtener_listaListas(ListaListas *lista, int index);

/**
 * Obtiene la longitud de la lista
 * parametros
 * lista: la lista sobre la cual obtener la longitud
 */
int longitud_listaListas(ListaListas *lista);

/**
 * Determina si existe o no un elemento (lista) en una posicion determinada
 * parametros
 * lista: la lista sobre la cual buscar
 * index: el indice a comprobar
 */
bool existe_listaListas(ListaListas *lista, int index); /*existe una lista en la posicion index?*/

/*escritura de informacion*/

/**
 * Agrega un elemento (lista) al final de una lista
 * parametros
 * lista: la lista a la cual agregar el elemento
 * elem: el nuevo elemento a agregar
 */
void agregar_final_listaListas(ListaListas *lista, Lista *elem);

/**
 * Inserta un elemento (lista) a una lista en una posicion determinada
 * parametros
 * lista: la lista sobre la cual agregar el elemento
 * elem: el elemento a insertar
 * index: el indice en donde insertar el elemento
 */
void agregar_indexado_listaListas(ListaListas *lista, Lista *elem, int index);

/**
 * Sobreescribe el elemento (lista) de una lista en una posicion determinada
 * parametros
 * lista: la lista sobre la cual reescribir un valor
 * elem: el nuevo valor del elemento a reescribir
 * index: el indice del elemento a reescribir
 */
void reescribir_listaListas(ListaListas *lista, Lista *elem, int index);

/**
 * Elimina el elemento (lista) de una lista en una posicion determinada
 * parametros
 * lista: la lista sobre la cual eliminar el elemento
 * index: indice del elemento a eliminar
 */
void eliminar_listaListas(ListaListas *lista, int index);

/**
 * Sobreescribe con una lista vacia en una posicion determinada
 * parametros
 * lista: la lista sobre la cual sobreescribir
 * index: el indice de la lista a sobreescribir
 */
void borrar_listaListas(ListaListas *lista, int index);

#endif